package com.example.concurrent.chapter13;

/**
 * @author Liuqz
 * @date 2018/11/25 20:02
 */
public class ThreadCloseale extends Thread {

    //volatile关键字保证了started线程的可见性
    private volatile boolean started = true;

    @Override
    public void run() {
        while (started) {
            //do work
        }
    }

    public void shutdown() {
        this.started = false;
    }

    /**
     * volatile和synchronized区别
     *
     * 1.使用上的区别
     * volatile关键字只能用于修饰实例变量或者类变量,不能用于修饰方法以及方法参数和局部变量,常量等
     * synchronized关键字不能用于对变量的修饰,只能用于修饰方法或者语句块
     * volatile修饰的变量可以为null,synchronized关键字同步语句块的monitor对象不能为null
     *
     *
     * 2.对原子性的保证
     * volatile无法保证原子性
     * 由于synchronized是一种排他的机制,因此被synchronized关键字修饰的同步代码是无法被中途打断的,因此其能够保证代码的原子性
     *
     *
     * 3.对有序性的保证
     * volatile关键字禁止JVM编译器以及处理器对其进行重排序,所以它能够保证有序性
     * 虽然synchronized关键字所修饰的同步方法也可以保证顺序性,但是这种顺序性是以程序的串行化执行换来的,在synchronized关键字所修饰的代码中代码指令也会发生指令重排序的情况
     *
     * 4.其他
     * volatile不会使线程陷入阻塞
     * synchronized关键字会使线程进入阻塞状态
     */
}
